#include<cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sys/types.h>
#include <dirent.h>

#include "SEL.h"

using namespace std;

int main(int argc, char *argv[]){
    string fileName,
           path,
           pathOUT;
    vector < string > archIN,
                      archOUT;
    DIR * directorio,
        * directorioOUT;
    
    /*Estructura dirent:
    ino_t  d_ino     Numero de Archivo (Es una estructura que contiene 
                                        mas datos acerca del archivo).
    char * d_name    Nombre de la entrada o archivo.*/
    
    struct dirent * entradaDir;

    
    if( argc == 3 ){
        
        path = argv[1];
        
        pathOUT = argv[2];
        
        if( path[ path.size() - 1 ] != '\\' && 
            path[ path.size() - 1 ] != '/' ) path += "/";
        
        if( pathOUT[ pathOUT.size() - 1 ] != '\\' && 
            pathOUT[ pathOUT.size() - 1 ] != '/' ) pathOUT += "/";
        
        //Se abre el directorio que se paso por argumento.
        directorio = opendir ( path.c_str() );
        directorioOUT = opendir ( pathOUT.c_str() );
        
        if (directorio != NULL && directorioOUT != NULL){
            /*Se lee el directorio, cada lectura con readdir()
            devuelve el nombre de algun archivo o fichero contenido
            dentro de este. Similar a tener un archivo de texto con un
            nombre de archivo por linea.
            
            Sugerencia de doble parentesis del compilador G++*/
            while ( ( entradaDir = readdir ( directorio ) ) ){
                string cmp;
                
                //Se toma de la estructura el nombre del archivo.
                fileName = entradaDir->d_name;
                
                if( fileName.size() > 2 ){
                    
                    cmp = fileName.substr( fileName.size() - 3 );
                
                    if( ! cmp.compare(".in") || ! cmp.compare(".IN") ){ 
                        archIN.push_back( path );
                        archIN[ archIN.size() - 1 ] += fileName;
                        
                        archOUT.push_back( pathOUT );
                        archOUT[ archOUT.size() - 1 ] += 
                                fileName.substr( 0 , fileName.size() - 3 ) + ".out";
                    }
                
                }
                
            }
            
            closedir (directorio);
            
        }else if(directorio != NULL){
            cout << path << ": No se pudo abrir el directorio.\n";
            return EXIT_FAILURE;
        }else if(directorioOUT != NULL){
            cout << pathOUT << ": No se pudo abrir el directorio.\n";
            return EXIT_FAILURE;
        }
            
        //Analisis de datos.
        for( unsigned int i = 0 ; i < archIN.size() ; i++ ){
            SEL<double> sist( archIN[i].c_str() );
                     
            if( sist.resolverPorInv() ){
                ofstream archivoOUT( archOUT[i].c_str() );
                archivoOUT << sist;
                archivoOUT.close();
            }else
                cout << "El archivo de entrada " << archIN[i] << " no tiene solucion.\n";
            
        }
        //[FIN]Analisis de datos.
        
    }else{
        cout << "SEL.exe:\n"
             << "Desarrollado por Grupo 1 | Cursada: JM | 2009\n\n"
             << "USO:\n"
             << "SEL.exe Directorio_Archivos_IN Directorio_Archivos_OUT\n\n"
             << "Ejemplo de uso:\n"
             << "SEL.exe IN/ OUT/\n";
        
        system("PAUSE");
            
        return EXIT_SUCCESS;
    }
    
    return EXIT_SUCCESS;
}
